Nocobaseで運用しているアプリで所属や役割などの履歴を持ちつつ現在の状態を表示させることはできない?
前提
Nocobaseで作成している社内向けアプリケーションで、コレクションとコレクションの関連付けを行なっているものがあります。
例えば、従業員と所属部署、生徒と所属学科 などが挙げられます。
関連付けですが、Nocobaseではさまざまな関連付けのフィールドをUI上から設定できます。
Relationship Fields
今回は、Many-to-Manyの関係性を持っているコレクションで、その関連の履歴を保持し続けるための方法を考えてみます。
現状
例) Many-to-Many のER
中間に関連付けの情報を保存するテーブルが存在しています。
従業員から見ると、複数の部署を関連づけられる状態ですが、履歴情報となると不十分な状態です。
従業員の作成時に部署の関連付けを行えるようにしています。
追加するたびに新しいレコードが作成されますが、変更したいとなった場合はUIから既存の情報を削除するので、レコードからは削除されてしまいます。
対応方法
関連付けの中間テーブルに日付フィールドを設けて判断する
関連付けの情報を保存しているテーブルに以下のフィールドを追加し、現在の日付がこの期間内なら有効なものとして判断してみます。
- 配属開始日(その部署に配属された日)
- 配属終了日(その部署から異動・退職した日、異動していない場合はNULL)
フィールド追加
日付のフィールドタイプで配属開始日と配属終了日を追加します。
関連付けを行うフォームを設置
関連付けるコレクションから追加する方法ではなく、関連付けの情報を保存しているテーブルから直接追加できるようにします。
関連づける2つのコレクション、追加した配属開始日と配属終了日を入力できるフォームを作成します。
登録例)
上記画像のように登録できるようになりました。
2024/10/29時点での有効な部署は2つとなります。
編集画面の修正
関連付けるコレクションの編集画面から編集できないように設定します。
Nocobaseでは編集不可のモードにすることが可能です。
これによりUI上からの意図しない削除を制限できるようになるはずです。
表示の制御(※1)
データ上では配属開始日・終了日を登録できる、削除の制御で有効なものを判定できるようにはなりました。
従業員の詳細情報の表示時、有効な部署しか表示させない
というのをNocobaseのアプリ上で判定して表示できるのか試してみます。
既存の状態では、
このように従業員に関連づけられているものが全て表示されています。
※ 一つは2025/01/01が配属開始日で登録している
結論として、従業員のコレクションのデータブロック内で制御させることはできなそうです。
従業員と部署の関連付けだと、関連付けのテーブルのフィールドではなく、関連先のテーブルのフィールドを参照するようになっているためです(この例だと部署コレクションのフィールド)
関連付けられたレコードを表示させる(※2)
データブロックの追加時、関連づけられたレコードを選択できます。
こちらも※1と同じく、関連付けのテーブルのフィールドではなく、関連先のテーブルのフィールドを参照するようになっていました。
関連付けテーブルの内容を制御して表示させる(※3)
データブロックの追加時、他のレコード
を選択し、直接関連付けテーブルを表示させます。
ただ追加しただけだと登録されているものが全て表示されてしまいますので、Nocobaseの機能であるデータ範囲の設定
を使って必要なものだけ表示させれるか試してみます。
ただし、関連付けの中間テーブルには、対象のIDしか保存されていないので、部署名、従業員等がなんなのかがわかりません。
これらを参照できるようにするには、関連付けの中間テーブルから関連先のテーブルに対して__Association fields__を追加してあげる必要があります。
多対1のフィールドタイプで、中間テーブルの外部キーと関連元(従業員と部署の2つ)のIDで関連を作成します。
これで関連付けテーブルの表示から部署や従業員の情報を参照できるようになるはずです
ではデータ範囲の設定
で現在の状態を表示できるように制御していきます。
条件としては、
- 関連付けの中間テーブルの従業員の外部キー と 現在表示している(ポップアップなど)従業員のID が同じ
- 関連付けが有効かどうか
- 現在の日時が配属開始日と終了日の期間内になっているかどうか
です。
意図したものだけ表示されるようにできました。
使用しているNocobaseのバージョン(1.2.29)では、※3の関連付けテーブルの内容を制御して表示させる
という方法のみが表示の制御をすることができました。
開始日・終了日を条件に含まないようにすると、時系列で過去の所属を全て表示させることもできました。
今回の関連付けの中間テーブルに日付フィールドを設けるやり方のデメリットは、登録の手間が増えてしまうことでしょうか。
これが許容できるのであればこの方法を使ってみてもいいかもしれません。